import router from '@/router'
import { useUserStore } from '@/stores/user'
import axios, { type Method } from 'axios'
import { ElMessage } from 'element-plus'
import { el } from 'element-plus/es/locales.mjs'

const service = axios.create({
  baseURL: 'https://api-hmzs.itheima.net/tj',
  timeout: 5000,
})

//后端返回值类型。
export interface ServiceResponse<T> {
  code: number,
  msg: string,
  data: T
}

// 4. 请求工具函数
export const request = <T>(url: string, method: Method = 'GET', submitData?: object, )=> {
  // service就是axios实例。   如果响应拦截器中减少了一层data。指定的类型就要放在第二个。
 return service.request<T,ServiceResponse<T>>({
   url,
   method,
   // [] 插值表达式 得到 对象的键名称。
   [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
 })
}
// 请求拦截器
service.interceptors.request.use(
  config => {
    //获取token
    const store =  useUserStore()
    //如果有token，自动添加到请求头中
    if(store.token){
      config.headers.Authorization = 'Bearer ' + store.token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  },
)
// 响应拦截器
service.interceptors.response.use(
  response => {
    //如果响应拦截器中减少了一层data
    return response.data
  },
  error => {
    // 如果后端有响应错误信息，就提示。（如果没有网络，就不会进入判断内部）
   if ( error.response ) {
    ElMessage.error(error.response.data.msg) // 错误提示
    // 如果后端返回401，就提示用户重新登录。
    if ( error.response.status === 401) {
      // 如果token过期，就跳转到登录页，并提示用户。
      router.push('/login')
      ElMessage.warning('登录信息已过期，请重新登录')
      // 使用useUserStore钩子获取用户信息存储对象
      const store = useUserStore()
      // 清除用户token，用于登出操作
      store.clearToken()
     }
   }else{
    return ElMessage.error('网络错误，请稍后重试')
   }
    return Promise.reject(error)
  },
)

export default service
